【小ネタ】セキュリティグループのインバウンドルールをまとめて削除する
データアナリティクス(DA)事業本部の川崎です。
先日、セキュリティグループを整理する機会があり、 これまではマネージメントコンソールから、個別に追加・削除していたのですが、 今回、AWS CLIを使って一括で削除する方法を試してみました。
1.コマンドのドキュメント確認
「revoke-security-group-ingress」のドキュメントには、 冒頭に、
To specify multiple rules in a single command use the --ip-permissions option
の記述があります。 複数のルールを指定する場合は、--ip-permissions を使ってください、とあります。
この --ip-permissions を指定することで、まとめて削除できそうです。
ただ、ドキュメントのExampleには、複数のルールを指定する方法が書かれていませんでした。この Example 2 の方法ですと、ルールを個別に削除していくことになります。
Example 2: To remove a rule using the IP permissions set
aws ec2 revoke-security-group-ingress \ --group-id sg-026c12253ce15eff7 \ --ip-permissions IpProtocol=icmp,FromPort=3,ToPort=4,IpRanges=[{CidrIp=0.0.0.0/0}]
まとめて削除する方法は、こちらのStackoverflowのやり取りが参考になりました。
2.セキュリティグループのIP permissions の内容を出力
まず、今回対象となるセキュリティグループのIP permissions を出力し、内容を確認します。
groupId="sg-0dxxxxxxxxxxxxxxx" aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions" [ { "FromPort": 5439, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.3.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 5439, "UserIdGroupPairs": [] }, { "FromPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.0.1/32" }, { "CidrIp": "172.31.1.1/32" }, { "CidrIp": "172.31.2.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 22, "UserIdGroupPairs": [] }, { "FromPort": 443, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.4.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 443, "UserIdGroupPairs": [] } ]
3.「revoke-security-group-ingress」を組み立て
次に、インバウンドルールを削除するコマンド「revoke-security-group-ingress」を組み立てていきます。 --cli-input-jsonオプションを使うことで、 先ほどの出力内容を変数に入れた上で、このように指定することができます。
groupId="sg-0dxxxxxxxxxxxxxxx" json_ingress=$(aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions") echo $json_ingress [ { "FromPort": 5439, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.3.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 5439, "UserIdGroupPairs": [] }, { "FromPort": 22, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.0.1/32" }, { "CidrIp": "172.31.1.1/32" }, { "CidrIp": "172.31.2.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 22, "UserIdGroupPairs": [] }, { "FromPort": 443, "IpProtocol": "tcp", "IpRanges": [ { "CidrIp": "172.31.4.1/32" } ], "Ipv6Ranges": [], "PrefixListIds": [], "ToPort": 443, "UserIdGroupPairs": [] } ] aws ec2 revoke-security-group-ingress --cli-input-json "{\"GroupId\": \"$groupId\", \"IpPermissions\": $json_ingress}"
上記のコマンドを実行し、セキュリティグループのインバウンドルールをまとめて削除できました。
aws ec2 describe-security-groups --group-id $groupId --query "SecurityGroups[0].IpPermissions" []
まとめ
--cli-input-jsonオプションを使う場合は、いつも「file://xxx.json」と、ファイルに保存したJSONを利用していましたが、 このようにシェルの変数として記述することもできるのですね。こっちの方が便利です、目からウロコでした。